<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>服务器编程接口</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="CHAPTER">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="plpython-database.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="plpython.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="reference.html">快进</a></td><td width="10%" align="right" valign="top"><a href="spi-interface.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="CHAPTER"><h1><a name="SPI"></a>章41. 服务器编程接口</h1>
<div>
<dl>
<dt><b>目录</b></dt>
<dt>41.1. <a href="spi-interface.html">接口函数</a></dt>
<dd><dl>
<dt><a href="spi-spi-connect.html">SPI_connect</a>&nbsp;--&nbsp;把一个过程与 SPI 管理器连接起来</dt>
<dt><a href="spi-spi-finish.html">SPI_finish</a>&nbsp;--&nbsp;把一个过程与 SPI 管理器断开</dt>
<dt><a href="spi-spi-push.html">SPI_push</a>&nbsp;--&nbsp;对 SPI 堆栈进行压栈操作以允许递归的 SPI 使用</dt>
<dt><a href="spi-spi-pop.html">SPI_pop</a>&nbsp;--&nbsp;弹出 SPI 堆栈以允许递归的 SPI 使用</dt>
<dt><a href="spi-spi-execute.html">SPI_execute</a>&nbsp;--&nbsp;执行一条命令</dt>
<dt><a href="spi-spi-exec.html">SPI_exec</a>&nbsp;--&nbsp;执行一个读/写命令</dt>
<dt><a href="spi-spi-prepare.html">SPI_prepare</a>&nbsp;--&nbsp;为一个命令准备一个规划但不立即执行它</dt>
<dt><a href="spi-spi-getargcount.html">SPI_getargcount</a>&nbsp;--&nbsp;返回一个 <code class="FUNCTION">SPI_prepare</code> 准备的已准备好规划需要的参数个数</dt>
<dt><a href="spi-spi-getargtypeid.html">SPI_getargtypeid</a>&nbsp;--&nbsp;返回 <code class="FUNCTION">SPI_prepare</code> 准备的已准备好规划的指定参数的 typeid</dt>
<dt><a href="spi-spi-is-cursor-plan.html">SPI_is_cursor_plan</a>&nbsp;--&nbsp;如果一个 <code class="FUNCTION">SPI_prepare</code> 准备的规划可以和 <code class="FUNCTION">SPI_cursor_open</code> 一起使用，则返回 <tt class="SYMBOL">true</tt></dt>
<dt><a href="spi-spi-execute-plan.html">SPI_execute_plan</a>&nbsp;--&nbsp;执行一个 <code class="FUNCTION">SPI_prepare</code> 准备的查询规划</dt>
<dt><a href="spi-spi-execp.html">SPI_execp</a>&nbsp;--&nbsp;以读/写模式执行一个准备的查询规划</dt>
<dt><a href="spi-spi-cursor-open.html">SPI_cursor_open</a>&nbsp;--&nbsp;用 <code class="FUNCTION">SPI_prepare</code> 创建的规划设置一个游标</dt>
<dt><a href="spi-spi-cursor-find.html">SPI_cursor_find</a>&nbsp;--&nbsp;用名字寻找并执行一个现存的游标</dt>
<dt><a href="spi-spi-cursor-fetch.html">SPI_cursor_fetch</a>&nbsp;--&nbsp;从一个游标里抓取一些行</dt>
<dt><a href="spi-spi-cursor-move.html">SPI_cursor_move</a>&nbsp;--&nbsp;移动一个游标</dt>
<dt><a href="spi-spi-cursor-close.html">SPI_cursor_close</a>&nbsp;--&nbsp;关闭一个游标</dt>
<dt><a href="spi-spi-saveplan.html">SPI_saveplan</a>&nbsp;--&nbsp;保存一个规划</dt>
</dl></dd>
<dt>41.2. <a href="spi-interface-support.html">接口支持函数</a></dt>
<dd><dl>
<dt><a href="spi-spi-fname.html">SPI_fname</a>&nbsp;--&nbsp;从指定的字段编号判断字段名字</dt>
<dt><a href="spi-spi-fnumber.html">SPI_fnumber</a>&nbsp;--&nbsp;判断声明字段名的字段编号</dt>
<dt><a href="spi-spi-getvalue.html">SPI_getvalue</a>&nbsp;--&nbsp;返回声明字段的字符串值</dt>
<dt><a href="spi-spi-getbinval.html">SPI_getbinval</a>&nbsp;--&nbsp;返回声明字段的二进制值</dt>
<dt><a href="spi-spi-gettype.html">SPI_gettype</a>&nbsp;--&nbsp;返回声明字段的数据类型名</dt>
<dt><a href="spi-spi-gettypeid.html">SPI_gettypeid</a>&nbsp;--&nbsp;返回声明字段的数据类型 OID</dt>
<dt><a href="spi-spi-getrelname.html">SPI_getrelname</a>&nbsp;--&nbsp;返回声明关系的名字</dt>
<dt><a href="spi-spi-getnspname.html">SPI_getnspname</a>&nbsp;--&nbsp;返回声明关系的名字空间</dt>
</dl></dd>
<dt>41.3. <a href="spi-memory.html">内存管理</a></dt>
<dd><dl>
<dt><a href="spi-spi-palloc.html">SPI_palloc</a>&nbsp;--&nbsp;在上层执行器环境里分配内存</dt>
<dt><a href="spi-realloc.html">SPI_repalloc</a>&nbsp;--&nbsp;在上层执行器环境里重新分配内存</dt>
<dt><a href="spi-spi-pfree.html">SPI_pfree</a>&nbsp;--&nbsp;在上层执行器环境里释放内存</dt>
<dt><a href="spi-spi-copytuple.html">SPI_copytuple</a>&nbsp;--&nbsp;在上层执行者环境里制作一个行的拷贝</dt>
<dt><a href="spi-spi-returntuple.html">SPI_returntuple</a>&nbsp;--&nbsp;准备把一个行当作 Datum 返回</dt>
<dt><a href="spi-spi-modifytuple.html">SPI_modifytuple</a>&nbsp;--&nbsp;通过替换一个给出行的选定的字段创建一行</dt>
<dt><a href="spi-spi-freetuple.html">SPI_freetuple</a>&nbsp;--&nbsp;释放在上层执行者环境里分配的一行</dt>
<dt><a href="spi-spi-freetupletable.html">SPI_freetuptable</a>&nbsp;--&nbsp;释放一个由 <code class="FUNCTION">SPI_execute</code> 或者类似函数创建的行集</dt>
<dt><a href="spi-spi-freeplan.html">SPI_freeplan</a>&nbsp;--&nbsp;释放一个前面保存的规划</dt>
</dl></dd>
<dt>41.4. <a href="spi-visibility.html">数据改变的可视性</a></dt>
<dt>41.5. <a href="spi-examples.html">例子</a></dt>
</dl>
</div>
<a name="AEN41840"></a>
<p>The <i class="FIRSTTERM">服务器编程接口</i>(SPI)给在用户定义的 C 函数里面运行 SQL 查询的能力。SPI 是一套接口函数，用于简化对分析器、规划器、优化器、执行器的访问。SPI 还进行一些内存管理的工作。</p>
<div class="NOTE">
<blockquote class="NOTE">
<p><b>【注意】</b>过程语言的存在也提供了其它的一些在过程里执行 SQL 命令的方法。这些语言中的大部分本身就是基于 SPI 的，因此这份文档可能会对那些语言的用户同样有帮助。</p>
</blockquote>
</div>
<p>为了避免混淆，将使用"函数"(function)来代表 SPI 接口函数，用"过程"(procedure)代表用户用 SPI 定义的 C 函数。</p>
<p>注意，如果一条通过 SPI 调用的命令失败，那么控制不会返回到你的过程中。取而代之的是，你的过程执行所在的事务或者子事务全部回滚。这一点看起来可能很奇怪，因为大多数 SPI 函数的文档里都有错误返回习惯。不过，那些习惯只适用于在 SPI 函数自己内部检测到的错误。可以通过在你自己的可能失败的 SPI 调用周围建立一个子事务的方法来在错误之后恢复。目前还没有写这方面的文档，因为所需要的机制仍然在变化。</p>
<p>如果执行成功了，SPI 函数返回一个非负结果(或者通过返回一个整数值或放在全局变量 <tt class="VARNAME">SPI_result</tt> 里，像下面描述的那样)。出错时，返回一个负数或 <tt class="SYMBOL">NULL</tt> 结果。</p>
<p>使用 SPI 的源代码文件必须包含头文件 <tt class="FILENAME">executor/spi.h</tt></p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="plpython-database.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="spi-interface.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">数据库访问</td><td width="34%" align="center" valign="top"><a href="server-programming.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">接口函数</td></tr>
</table>
</div>
</body></html>